home *** CD-ROM | disk | FTP | other *** search
/ Light ROM 1 / LIGHT-ROM 1 (Amiga Library Services)(1994).iso / ffdisks / d949.lha / BBBBS / BBBBS65.lha / rexx / bbsQUICKIN.rexx < prev    next >
OS/2 REXX Batch file  |  1993-08-01  |  26KB  |  1,073 lines

  1. /* $VER: bbsQUICKIN.rexx 6.2 © 1993 Richard Lee Stockton (1.8.93) 
  2.    - FREELY DISTRIBUTABLE AS LONG AS THIS NOTICE REMAINS -
  3.  
  4.    Processes archive "QUICKIN.lha" in user's emailfiles.
  5.    Should be made by bbsQUICK.rexx, the offline reader.
  6.    Handles incoming mail, messages, downloads, and uploads.
  7.    Also handles some sysop and super-sysop offline functions.
  8. */
  9.  
  10. CR='0D'x
  11. LF='0A'x
  12. SIGNAL ON ERROR
  13. SIGNAL ON SYNTAX
  14. SIGNAL ON FAILURE
  15.  
  16. ARG name level sysoplevel accessflag .
  17.  
  18. fromcli=0
  19. figarg='s:CONFIG.BBS'
  20. IF ~EXISTS(figarg) THEN figarg='BBS:BBS_TEXT/CONFIG.BBS'
  21. x=OPEN(f,figarg,'R')
  22. IF x=0 THEN
  23.   DO
  24.     SAY 's:CONFIG.BBS and BBS:BBS/CONFIG.BBS are both missing!'
  25.     CALL GETOUT(20)
  26.   END
  27. lynes.=''
  28. DO i=1 TO 31
  29.   lynes.i=READLN(f)
  30. END
  31. CALL CLOSE(f)
  32. compos=POS('/*',lynes.1)
  33. IF compos>0 THEN lynes.1=LEFT(lynes.1,compos-1)
  34. bbsname=STRIP(lynes.1)
  35. sysop=WORD(lynes.2,1)
  36. calls=WORD(lynes.31,1)
  37. IF name='' THEN
  38.   DO
  39.     sysoplevel=WORD(lynes.5,1)
  40.     bbspath=WORD(lynes.6,1)
  41.     IF RIGHT(bbspath,1)~=':' & RIGHT(bbspath,1)~='/' THEN bbspath=bbspath'/'
  42.     msgpath=WORD(lynes.7,1)
  43.     IF RIGHT(msgpath,1)~=':' & RIGHT(msgpath,1)~='/' THEN msgpath=msgpath'/'
  44.     libpath=WORD(lynes.8,1)
  45.     IF RIGHT(libpath,1)~=':' & RIGHT(libpath,1)~='/' THEN libpath=libpath'/'
  46.     name=sysop
  47.     IF ~EXISTS(bbspath'EmailFiles/'name'/QUICKIN.lha') THEN
  48.       DO
  49.         SAY bbspath'EmailFiles/'name'/QUICKIN.lha does not exist!'
  50.         CALL GETOUT(21)
  51.       END
  52.     level=99
  53.     sysoplevel=99
  54.     accessflag=0
  55.     fromcli=1
  56.   END
  57. ELSE
  58.   DO
  59.     bbspath=GETCLIP('BBS_path')
  60.     msgpath=GETCLIP('BBS_msgpath')
  61.     libpath=GETCLIP('BBS_libpath')
  62.   END
  63.  
  64. /* Wait 10 mins for QUICKOUT process (started by this user) to finish */
  65.  
  66. DO i=1 TO 100 WHILE GETCLIP('BBS_'name)='QUICK'
  67.   CALL DELAY(300)
  68. END
  69.  
  70. /* Only one QUICKIN process at a time per user */
  71.  
  72. IF GETCLIP('BBS_'name)='QUICKIN' THEN EXIT
  73. CALL PRAGMA('P',-1)
  74.  
  75. CALL TIME('R')
  76. CALL SETCLIP('BBS_'name,'QUICKIN')
  77. DO i=1 WHILE GETCLIP('BBS_QUICK_WAIT')~=''
  78.   CALL DELAY(500)                 /* wait for main filesaves to complete */
  79.   IF TIME('E')>42000 THEN LEAVE i /* don't wait forever */
  80. END
  81. DO i=1
  82.   IF GETCLIP('BBS_QUICKIN'i)='' THEN  /* info clip for external STOP */
  83.     DO
  84.       CALL SETCLIP('BBS_QUICKIN'i,name)
  85.       clipnum=i
  86.       LEAVE i
  87.     END
  88. END
  89. arcfile=bbspath'Emailfiles/'name'/QUICKIN.lha'
  90. savefiles=0
  91. upfiles=-1
  92. upbytes=0
  93. upmail=0
  94. upmsg=''
  95.  
  96. lastm=get_last(bbspath'Numbers/LastMail')
  97. CALL CLOSE(STDOUT)
  98. CALL OPEN(STDOUT,bbspath'Email/'name'/BBBBS.'lastm,'W')
  99. SAY ' Mail: 'lastm
  100. SAY ' From: BBBBS'
  101. SAY '   To: 'name
  102. SAY ' Subj: QUICKIN Report'
  103. SAY ' Date: 'DATE('W') DATE() TIME('C')
  104. SAY LEFT('=',75,'=')
  105. SAY 'Here is the log of your QUICKIN file processing.'
  106. SAY STRIP(SUBSTR(SOURCELINE(1),10))
  107. SAY
  108.  
  109. ADDRESS COMMAND 'lha -q t' arcfile
  110. IF RC>0 THEN
  111.   DO
  112.     SAY 'QUICKIN archive is corrupt!  Aborting...'
  113.     SIGNAL DONE
  114.   END
  115.  
  116. CALL MAKEDIR('RAM:QUICK')
  117. CALL PRAGMA('D','RAM:QUICK')
  118. ADDRESS COMMAND 'CD RAM:QUICK' LF 'lha -mN x' arcfile
  119. SAY
  120.  
  121. CALL check_abort()
  122. CALL do_file_requests()
  123. CALL check_abort()
  124. CALL do_file_deletes()
  125.  
  126. DO i=.001 TO .999 BY .001
  127.   CALL check_abort()
  128.   hdr=RIGHT(i,3)'.HDR'
  129.   IF ~EXISTS(hdr) THEN ITERATE i
  130.   txt=RIGHT(i,3)'.TXT'
  131.   x=OPEN(f,hdr,'R')
  132.   IF x=0 THEN
  133.     DO
  134.       SAY hdr 'failed to open for reading.'
  135.       ITERATE i
  136.     END
  137.   hdr.=''
  138.   DO j=1 TO 6
  139.     hdr.j=READLN(f)
  140.   END
  141.   CALL CLOSE(f)
  142.   IF LEFT(hdr.1,6)='File: ' THEN CALL do_file()
  143.   ELSE IF LEFT(hdr.1,6)='  Msg:' THEN CALL do_msg()
  144.   ELSE IF LEFT(hdr.1,6)=' Mail:' THEN CALL do_mail()
  145.   ELSE
  146.     DO
  147.       SAY
  148.       SAY hdr 'is an unknown header type!'
  149.       DO j=1 TO 6
  150.         SAY hdr.j
  151.         SAY
  152.       END
  153.       ITERATE i
  154.     END
  155.   IF WORDS(SHOWDIR('RAM:QUICK','F'))=0 THEN LEAVE i
  156. END
  157.  
  158. IF savefiles=1 THEN
  159.   DO
  160.     x=OPEN(f,bbspath'Lists/Files','W')
  161.     IF x=0 THEN SAY bbspath'Lists/Files failed to open for writing!'
  162.     ELSE
  163.       DO
  164.         DO i=1 TO f.0
  165.           IF f.i~='' THEN CALL WRITELN(f,i f.i)
  166.         END
  167.         CALL CLOSE(f)
  168.         SAY 'Updated Lists/Files'
  169.       END
  170.     x=OPEN(f,bbspath'Lists/Files.ALPHA','W')
  171.     IF x=0 THEN SAY bbspath'Lists/Files.ALPHA failed to open for writing!'
  172.     ELSE
  173.       DO
  174.         DO i=1 TO a.0
  175.           num=WORD(a.i,3)
  176.           IF a.i~='' & f.num~='' THEN CALL WRITELN(f,a.i)
  177.         END
  178.         CALL CLOSE(f)
  179.         SAY 'Updated Lists/Files.ALPHA'
  180.       END
  181.     IF SHOW('P','BBBBS') THEN CALL SETCLIP('BBS_localfiles',2)
  182.     IF SHOW('P','BBBBS_LOCAL') THEN CALL SETCLIP('BBS_mainfiles',2)
  183.   END
  184.  
  185. DROP a. f. libs.
  186.  
  187. CALL check_abort()
  188.  
  189. IF EXISTS('RAM:QUICK/Files') THEN
  190.   ADDRESS COMMAND 'delete RAM:QUICK/Files ALL QUIET'
  191.  
  192. IF EXISTS('RAM:QUICK/Information') THEN
  193.   DO
  194.     IF level=99 THEN
  195.       ADDRESS COMMAND 'copy RAM:QUICK/Information/#?' bbspath'Information'
  196.     ADDRESS COMMAND 'delete RAM:QUICK/Information ALL QUIET'
  197.   END
  198. IF EXISTS('RAM:QUICK/BBS_TEXT') THEN
  199.   DO
  200.     IF level=99 THEN
  201.       ADDRESS COMMAND 'copy RAM:QUICK/BBS_TEXT/#?' bbspath'BBS_TEXT'
  202.     ADDRESS COMMAND 'delete RAM:QUICK/BBS_TEXT ALL QUIET'
  203.   END
  204. IF EXISTS('RAM:QUICK/rexxDoors') THEN
  205.   DO
  206.     IF level=99 THEN
  207.       ADDRESS COMMAND 'copy RAM:QUICK/rexxDoors/#?' bbspath'rexxDoors ALL'
  208.     ADDRESS COMMAND 'delete RAM:QUICK/rexxDoors ALL QUIET'
  209.   END
  210. IF EXISTS('RAM:QUICK/REXX') THEN
  211.   DO
  212.     IF level=99 THEN
  213.       ADDRESS COMMAND 'copy RAM:QUICK/REXX/#? REXX:'
  214.     ADDRESS COMMAND 'delete RAM:QUICK/REXX ALL QUIET'
  215.   END
  216. IF EXISTS('RAM:QUICK/S') THEN
  217.   DO
  218.     IF level=99 THEN
  219.       ADDRESS COMMAND 'copy RAM:QUICK/S/#? S:'
  220.     ADDRESS COMMAND 'delete RAM:QUICK/S ALL QUIET'
  221.   END
  222. IF EXISTS('RAM:QUICK/C') THEN
  223.   DO
  224.     IF level=99 THEN
  225.       ADDRESS COMMAND 'copy RAM:QUICK/C/#? C:'
  226.     ADDRESS COMMAND 'delete RAM:QUICK/C ALL QUIET'
  227.   END
  228. CALL check_abort()
  229. IF EXISTS('RAM:QUICK/MSG') THEN
  230.   DO
  231.     IF level=99 THEN
  232.       DO
  233.         d=SHOWDIR('RAM:QUICK/MSG','F')
  234.         DO i=1 TO WORDS(d)
  235.           msg=WORD(d,i)
  236.           PARSE VAR msg 'MSG'conf'.'msgnum
  237.           IF DATATYPE(conf,'W') & DATATYPE(msgnum,'W') THEN
  238.             DO
  239.               newname=msgpath'MSG'conf'/'msgnum
  240.               IF EXISTS(newname) THEN
  241.                 DO
  242.                   SAY newname 'already exists!'
  243.                   ITERATE i
  244.                 END
  245.               x=OPEN(f,'RAM:QUICK/MSG/'msg,'R')
  246.               IF x=0 THEN ITERATE i
  247.               a=READCH(f,65000)
  248.               CALL CLOSE(f)
  249.               a='!!'SUBSTR(a,3)
  250.               x=OPEN(f,newname,'W')
  251.               IF x=0 THEN ITERATE i
  252.               CALL WRITECH(f,a)
  253.               CALL CLOSE(f)
  254.               SAY 'Un-deleted message' msgnum 'in conference' conf
  255.             END
  256.         END
  257.       END
  258.     ADDRESS COMMAND 'delete RAM:QUICK/MSG ALL QUIET'
  259.   END
  260. SAY
  261.  
  262. CALL check_abort()
  263.  
  264. IF EXISTS('Super') THEN
  265.   DO
  266.     IF level=99 & EXISTS('Super/Super.rexx') THEN
  267.       DO
  268.         CALL PRAGMA('D','Super')
  269.         SAY 'running Super.rexx...'
  270.         CALL Super.rexx()
  271.         CALL PRAGMA('D','/')
  272.         SAY
  273.       END
  274.     CALL DELETE('Super/Super.rexx')
  275.     CALL DELETE('Super')
  276.   END
  277.  
  278. d=SHOWDIR('RAM:QUICK','F')
  279. IF d~='' THEN
  280.   DO
  281.     SAY
  282.     SAY 'Unable to process the following files.'
  283.     SAY
  284.     DO i=1 TO WORDS(d)
  285.       SAY
  286.       dname=WORD(d,i)
  287.       SAY 'Filename:' dname
  288.       x=OPEN(f,'RAM:QUICK/'dname,'R')
  289.       IF x=0 THEN
  290.         DO
  291.          SAY dname 'failed to open for reading!'
  292.           ITERATE i
  293.         END
  294.       stuff=READCH(f,65000)
  295.       CALL CLOSE(f)
  296.       CALL WRITECH(STDOUT,stuff)
  297.       CALL DELETE('RAM:QUICK/'dname)
  298.     END
  299.   END
  300.  
  301. DONE:
  302. CALL DELETE(arcfile)
  303.  
  304. IF GETCLIP('BBS_level')~='' & WORD(GETCLIP('BBS_lastcaller'),1)=name THEN
  305.   DO
  306.     oldmess=GETCLIP('BBS_MESSAGE')
  307.     IF oldmess~='' THEN oldmess=oldmess||'0D0A'x
  308.     newmess='Your QUICKIN archive has been processed. A report is waiting in Email.'
  309.     CALL SETCLIP('BBS_MESSAGE',oldmess||newmess)
  310.     IF upfiles>0 | upmail>0 | upmsg~='' THEN
  311.       DO
  312.         CALL SETCLIP(name'_UPDATE',upfiles upbytes upmail upmsg)
  313.         upfiles=0
  314.         upbytes=0
  315.         upmail=0
  316.         upmsg=''
  317.       END
  318.   END
  319.  
  320. IF upfiles>0 | upmail>0 | upmsg~='' THEN
  321.   DO
  322.     x=OPEN(f,bbspath'Users/'name,'R')
  323.     IF x~=0 THEN
  324.       DO
  325.         data.=''
  326.         DO i=1
  327.           line=READLN(f)
  328.           IF EOF(f) THEN LEAVE i
  329.           data.i=line
  330.         END
  331.         CALL CLOSE(f)
  332.         data.0=i-1
  333.         IF upfiles>0 THEN
  334.           DO
  335.             files=WORD(data.14,1)
  336.             bytes=WORD(data.14,3)
  337.             IF DATATYPE(files,'W') THEN upfiles=upfiles+files
  338.             IF ~DATATYPE(bytes,'W') THEN bytes=upbytes
  339.             ELSE IF fromcli THEN
  340.               DO
  341.                 bytes=bytes+upbytes
  342.                 files=files+1
  343.               END
  344.             data.14=upfiles 'files' bytes 'bytes.' DATE()
  345.           END
  346.         IF upmail>0 THEN
  347.           DO
  348.             mail=WORD(data.17,2)
  349.             IF DATATYPE(mail,'W') THEN upmail=upmail+mail
  350.             data.17=WORD(data.17,1) upmail WORD(data.17,3)
  351.           END
  352.         IF upmsg~='' THEN
  353.           DO
  354.             temp=data.23
  355.             data.23=''
  356.             DO i=1 TO level
  357.               msg=WORD(temp,i)
  358.               IF ~DATATYPE(msg,'W') THEN msg=0
  359.               DO j=1 TO WORDS(upmsg)
  360.                 IF WORD(upmsg,j)=i THEN msg=msg+1
  361.               END
  362.               data.23=data.23 msg
  363.             END
  364.           END
  365.         x=OPEN(f,bbspath'Users/'name,'W')
  366.         IF x~=0 THEN
  367.           DO
  368.             DO i=1 TO data.0
  369.               CALL WRITELN(f,data.i)
  370.             END
  371.             CALL CLOSE(f)
  372.             SAY 'User file' name 'updated.'
  373.           END
  374.       END
  375.   END
  376.  
  377. SAY 'QUICKIN archive for' name 'sucessfully processed at' TIME('C')
  378. temp='It took'
  379. secs=TIME('E')
  380. mins=secs%60
  381. hrs=mins%60
  382. secs=secs//60
  383. mins=mins//60
  384. IF hrs=1 THEN temp=temp '1 hour'
  385. ELSE IF hrs>0 THEN temp=temp hrs 'hours'
  386. IF mins=1 THEN temp=temp '1 minute'
  387. ELSE IF mins>0 THEN temp=temp mins 'minutes'
  388. IF secs=1 THEN temp=temp '1 second'
  389. ELSE IF secs>0 THEN temp=temp secs 'seconds'
  390. temp=temp 'to process this file'
  391. SAY ' -' temp '-'
  392. SAY
  393. CALL GETOUT(0)
  394. EXIT
  395.  
  396.  
  397. /* Functions */
  398.  
  399.  
  400. check_abort:
  401. t=GETCLIP('BBS_STOP_QUICKIN'clipnum)
  402. IF t='' THEN RETURN
  403. CALL SETCLIP('BBS_STOP_QUICKIN'clipnum)
  404. SAY 'Aborted at' TIME('C')
  405. IF t='DELETE' THEN
  406.   DO
  407.     CALL DELETE(arcfile)
  408.     ADDRESS COMMAND 'c:delete RAM:QUICK/#? ALL'
  409.   END
  410. CALL GETOUT(0)
  411. RETURN
  412.  
  413.  
  414. do_file:
  415. PARSE VAR hdr.1 'File:' filenum .'KeyWords: 'keywords 
  416. filename=WORD(hdr.2,2)
  417. IF ~DATATYPE(filenum,'W') & ~EXISTS('Files/'filename) THEN
  418.   DO
  419.     SAY filename 'did not arrive with the QUICKIN archive!'
  420.     RETURN
  421.   END
  422. toname=WORD(hdr.3,2)
  423. lib=WORD(hdr.3,9)
  424. IF load_files() THEN RETURN
  425. IF load_alpha() THEN RETURN
  426. CALL load_libs()
  427. IF DATATYPE(filenum,'W') THEN
  428.   DO
  429.     IF f.filenum='' THEN
  430.       DO
  431.         SAY 'File number' filenum '['lib'/'filename'] does not exist!'
  432.         RETURN
  433.       END
  434.     PARSE VAR f.filenum oldlib' 'oldname .
  435.     IF lib='^' THEN lib=oldlib
  436.     IF filename='^' THEN filename=oldname
  437.   END
  438. DO ii=1 TO level
  439.   IF UPPER(lib)=UPPER(libs.ii) THEN LEAVE ii
  440. END
  441. IF ii>level THEN
  442.   DO
  443.     SAY 'Unknown File Library:' lib 'for' filename
  444.     IF sysoplibnum=0 | DATATYPE(filenum,'W') THEN RETURN
  445.     SAY 'Placing' filename 'in Sysops library.'
  446.     lib='Sysops'
  447.     libnum=sysoplibnum
  448.   END
  449. ELSE libnum=ii
  450. IF DATATYPE(filenum,'W') THEN
  451.   DO
  452.     IF sysoplevel>level THEN RETURN
  453.     subpath=oldlib'/'oldname
  454.     finfo=STATEF(bbspath'FileNotes/'subpath)
  455.     x=OPEN(f,bbspath'FileNotes/'subpath,'R')
  456.     IF x=0 THEN
  457.       DO
  458.         SAY bbspath'FileNotes/'subpath 'failed to open for reading!'
  459.         RETURN
  460.       END
  461.     note.=''
  462.     DO ii=1 WHILE ~EOF(f)
  463.       note.ii=READLN(f)
  464.     END
  465.     CALL CLOSE(f)
  466.     note.0=ii
  467.     IF note.ii='' THEN note.0=ii-1
  468.     IF UPPER(lib)~=UPPER(oldlib) | UPPER(filename)~=UPPER(oldname) THEN
  469.       DO
  470.         IF EXISTS(libpath||subpath) THEN
  471.           DO
  472.             ADDRESS COMMAND 'copy' libpath||subpath libpath||lib'/'filename
  473.             CALL DELETE(libpath||subpath)
  474.           END
  475.         comm='copy' bbspath'FileNotes/'subpath
  476.         comm=comm bbspath'FileNotes/'lib'/'filename 'CLONE'
  477.         ADDRESS COMMAND comm
  478.         CALL DELETE(bbspath'FileNotes/'subpath)
  479.         IF UPPER(lib)~=UPPER(oldlib) THEN
  480.           DO
  481.             PARSE VAR note.3 front'Lib:' .
  482.             note.3=front'Lib:' lib
  483.             SAY '  Moved:' filename 'from' oldlib 'to' lib 'library.'
  484.           END
  485.         IF UPPER(filename)~=UPPER(oldname) THEN
  486.           DO
  487.             PARSE VAR note.2 'Name:' . 'Size: 'back
  488.             note.2='Name:' LEFT(filename,27)' Size: 'back
  489.             SAY 'Renamed:' oldname 'to' filename 'in the' lib 'library.'
  490.           END
  491.         f.filenum=lib filename
  492.       END
  493.     IF keywords~='^' THEN
  494.       DO
  495.         PARSE VAR note.1 front'KeyWords:' . 
  496.         note.1=front'KeyWords:' keywords
  497.         SAY 'Changed: KeyWords for' lib'/'filename'.'
  498.       END
  499.     IF toname~=WORD(note.3,2) & toname~='^' THEN
  500.       DO
  501.         PARSE VAR note.3 'From: 'fromname back
  502.         note.3='From:' toname back
  503.         SAY 'Changed: Uploader of' lib'/'filename 'from' fromname 'to' toname'.'
  504.       END
  505.     num=f.filenum.0
  506.     IF DATATYPE(num,'W') THEN
  507.       DO
  508.         PARSE VAR note.1 . 'KeyWords: 'keywords
  509.         alpha=LEFT(filename,22-LENGTH(WORD(note.2,4)))
  510.         alpha=alpha WORD(note.2,4) RIGHT(filenum,5)
  511.         alpha=alpha RIGHT(libnum,2) LEFT(lib,12)
  512.         alpha=alpha STRIP(LEFT(STRIP(keywords),32))
  513.         a.num=alpha
  514.       END
  515.     DO ii=1 TO 4
  516.       hdr.ii=note.ii
  517.     END
  518.     IF EXISTS(txt) THEN
  519.       SAY 'Changed long file description for' lib'/'filename
  520.     ELSE IF note.0>4 THEN
  521.       DO
  522.         x=OPEN(f,txt,'W')
  523.         IF x=0 THEN SAY txt 'failed to open for writing!'
  524.         ELSE
  525.           DO ii=5 TO note.0
  526.             CALL WRITELN(f,note.ii)
  527.           END
  528.         CALL CLOSE(f)
  529.         CALL DELAY(14)
  530.       END
  531.     CALL write_msg(4,bbspath'FileNotes/'lib'/'filename)
  532.   END
  533. ELSE
  534.   DO
  535.     DO ii=1 TO f.0
  536.       IF UPPER(WORD(f.ii,2))=UPPER(filename) THEN
  537.         DO
  538.           SAY filename 'is already here, in the' WORD(f.ii,1) 'library.'
  539.           RETURN
  540.         END
  541.     END
  542.     lastf=get_last(bbspath'Numbers/LastFile')
  543.     IF accessflag & sysoplevel>level THEN lib='Sysops'
  544.     ADDRESS COMMAND 'copy RAM:QUICK/Files/'filename libpath||lib
  545.     hdr.1='File:' lastf SUBSTR(hdr.1,13)
  546.     hdr.3='From: 'LEFT(name,27)' Date: 'DATE() TIME('C')'  Lib: 'lib
  547.     CALL write_msg(4,bbspath'FileNotes/'lib'/'filename)
  548.     f.lastf=lib filename
  549.     f.0=lastf
  550.     PARSE VAR hdr.1 . 'KeyWords: 'keywords
  551.     alpha=LEFT(filename,22-LENGTH(WORD(hdr.2,4)))
  552.     alpha=alpha WORD(hdr.2,4) RIGHT(lastf,5)
  553.     alpha=alpha RIGHT(libnum,2) LEFT(lib,12)
  554.     alpha=alpha STRIP(LEFT(STRIP(keywords),32))
  555.     DO ii=a.0 TO 1 BY -1
  556.       n=ii+1
  557.       IF STRIP(a.ii)='' THEN
  558.         DO WHILE STRIP(a.ii)='' & ii>1
  559.           ii=ii-1
  560.         END
  561.       IF UPPER(a.ii)>UPPER(alpha) THEN
  562.         DO
  563.           num=WORD(a.ii,3)
  564.           IF DATATYPE(num,'W') THEN f.num.0=n
  565.           a.n=a.ii
  566.         END
  567.       ELSE
  568.         DO
  569.           a.n=alpha
  570.           f.lastf.0=n
  571.           LEAVE ii
  572.         END
  573.     END
  574.     IF ii<1 THEN
  575.       DO
  576.         a.1=alpha
  577.         f.lastf.0=1
  578.       END
  579.     a.0=a.0+1
  580.     upfiles=upfiles+1
  581.     newbytes=
  582.     upbytes=upbytes+WORD(alpha,2)
  583.     newf=bbspath'EMail/'sysop'/NEW_FILES'
  584.     IF EXISTS(newf) THEN ok=OPEN(f,newf,'A')
  585.     ELSE
  586.       DO
  587.         ok=OPEN(f,newf,'W')
  588.         IF ok~=0 THEN CALL WRITELN(f,'*** New Files ***') 
  589.       END
  590.     IF ok~=0 THEN CALL WRITELN(f,name 'uploaded' lib'/'filename'  'DATE() TIME() 'via QUICK')
  591.     CALL CLOSE(f)
  592.     SAY 'Uploaded' filename 'as file' lastf 'in the' lib 'library.'
  593.     IF WORD(lynes.24,1)='1' THEN CALL bbsNewFile.rexx(name libpath||lib'/'filename)
  594.   END
  595. savefiles=1
  596. RETURN
  597.  
  598.  
  599. do_msg:
  600. toname=WORD(hdr.3,2)
  601. conf=WORD(hdr.5,8)
  602. IF conf.0~='' THEN CALL load_conf()
  603. DO ii=1 TO level
  604.   IF UPPER(conf)=UPPER(conf.ii) THEN LEAVE ii
  605. END
  606. IF ii>level THEN
  607.   DO
  608.     SAY 'Unknown Message Conference:' conf
  609.     RETURN
  610.   END
  611. confnum=ii
  612. lastm=get_last(bbspath'Numbers/LastMessage'confnum)
  613. hdr.1='  Msg:' lastm
  614. hdr.5=' Date:' DATE('W') DATE() TIME('C')
  615. hdr.5=LEFT(hdr.5,39) 'Conference:' conf
  616. replynum=WORD(hdr.3,4)
  617. IF DATATYPE(replynum,'W') THEN
  618.   DO
  619.     x=OPEN(f,msgpath'MSG'confnum'/'replynum,'R')
  620.     IF x~=0 THEN
  621.       DO
  622.         data.=''
  623.         DO ii=1 WHILE ~EOF(f)
  624.           data.ii=READLN(f)
  625.         END
  626.         CALL CLOSE(f)
  627.         data.0=ii
  628.         IF data.ii='' THEN data.0=ii-1
  629.         IF WORDS(data.1)>3 THEN data.1=data.1 lastm
  630.         ELSE data.1=data.1'   Reply' lastm
  631.         x=OPEN(f,msgpath'MSG'confnum'/'replynum,'W')
  632.         IF x~=0 THEN
  633.           DO ii=1 TO data.0
  634.             CALL WRITELN(f,data.ii)
  635.           END
  636.         CALL CLOSE(f)
  637.       END
  638.   END
  639. IF write_msg(6,msgpath'MSG'confnum'/'lastm) THEN
  640.   DO
  641.     SAY 'Sent message' lastm 'to' toname 'in the' conf 'conference.'
  642.     upmsg=STRIP(upmsg confnum)
  643.   END
  644. IF ~EXISTS(bbspath'Users/'toname) THEN RETURN
  645. x=OPEN(f,bbspath'Users/'toname,'R')
  646. IF x=0 THEN
  647.   DO
  648.     SAY bbspath'Users/'toname 'failed to open for reading.'
  649.     RETURN
  650.   END
  651. data.=''
  652. DO ii=1 WHILE ~EOF(f)
  653.   data.ii=READLN(f)
  654. END
  655. CALL CLOSE(f)
  656. data.0=ii-1
  657. data.24=data.24 confnum'/'lastm
  658. x=OPEN(f,bbspath'Users/'toname,'W')
  659. IF x=0 THEN
  660.   DO
  661.     SAY bbspath'Users/'toname 'failed to open for writing.'
  662.     RETURN
  663.   END
  664. DO ii=1 TO data.0
  665.   CALL WRITELN(f,data.ii)
  666. END
  667. CALL CLOSE(f)
  668. RETURN
  669.  
  670.  
  671. do_mail:
  672. toname=WORD(hdr.3,2)
  673. mailpath=bbspath'Email/'toname
  674. IF ~EXISTS(mailpath) THEN
  675.   DO
  676.     SAY mailpath 'does not exist, or failed to open!  Unable to send mail.'
  677.     RETURN
  678.   END
  679. lastm=get_last(bbspath'Numbers/LastMail')
  680. PARSE VAR hdr.1 . 'FILE: 'emailfile .
  681. hdr.1=' Mail:' lastm
  682. IF emailfile~='' & EXISTS('RAM:QUICK/Files/'emailfile) THEN
  683.   hdr.1=hdr.1'    FILE:' emailfile
  684. hdr.5=' Date: 'DATE('W') DATE() TIME('C')
  685. IF write_msg(6,mailpath'/'name'.'lastm) THEN SAY 'Sent email' lastm 'to' toname'.'
  686. IF emailfile~='' & EXISTS('RAM:QUICK/Files/'emailfile) THEN
  687.   DO
  688.     mailfilepath=bbspath'EmailFiles/'toname
  689.     CALL MAKEDIR(mailfilepath)
  690.     ADDRESS COMMAND 'copy RAM:QUICK/Files/'emailfile mailfilepath
  691.     IF WORD(lynes.24,1)='1' THEN
  692.       CALL bbsNewFile.rexx(name 'RAM:QUICK/Files/'emailfile)
  693.     hdr.1=hdr.1'    FILE:' emailfile
  694.     SAY '...with attached file;' emailfile
  695.   END
  696. upmail=upmail+1
  697. RETURN
  698.  
  699.  
  700. write_msg:
  701. PARSE ARG hdrstop,ofile
  702. data=''
  703. x=OPEN(f,txt,'R')
  704. IF x=0 THEN
  705.   DO
  706.     IF hdrstop=6 THEN
  707.       DO
  708.         SAY txt 'failed to open for reading.'
  709.         RETURN 0
  710.       END
  711.   END
  712. ELSE data=READCH(f,65000)
  713. CALL CLOSE(f)
  714. x=OPEN(f,ofile,'W')
  715. IF x=0 THEN
  716.   DO
  717.     SAY ofile 'failed to open for writing.'
  718.     RETURN 0
  719.   END
  720. DO ii=1 TO hdrstop
  721.   CALL WRITELN(f,hdr.ii)
  722. END
  723. IF data~='' THEN CALL WRITECH(f,data)
  724. CALL CLOSE(f)
  725. CALL DELETE(hdr)
  726. CALL DELETE(txt)
  727. RETURN 1
  728.  
  729.  
  730. load_files:
  731. IF DATATYPE(f.0,'W') THEN RETURN 0
  732. f.=''
  733. x=OPEN(f,bbspath'Lists/Files','R')
  734. IF x=0 THEN
  735.    DO
  736.     SAY bbspath'Lists/Files failed to open for reading!'
  737.     RETURN 1
  738.   END
  739. f.0=0
  740. DO ii=1 WHILE ~EOF(f)
  741.   line=READLN(f)
  742.   num=WORD(line,1)
  743.   IF DATATYPE(num,'W') THEN
  744.     DO
  745.       f.num=WORD(line,2) WORD(line,3)
  746.       IF num>f.0 THEN f.0=num
  747.     END
  748. END
  749. CALL CLOSE(f)
  750. RETURN 0
  751.  
  752.  
  753. load_alpha:
  754. IF DATATYPE(a.0,'W') THEN RETURN 0
  755. a.=''
  756. x=OPEN(f,bbspath'Lists/Files.ALPHA','R')
  757. IF x=0 THEN
  758.   DO
  759.     SAY bbspath'Lists/Files.ALPHA failed to open for reading!'
  760.     RETURN 1
  761.   END
  762. DO ii=1 WHILE ~EOF(f)
  763.   a.ii=READLN(f)
  764.   num=WORD(a.ii,3)
  765.   IF DATATYPE(num,'W') THEN f.num.0=ii
  766. END
  767. CALL CLOSE(f)
  768. a.0=ii
  769. DO WHILE STRIP(a.ii)=''
  770.   ii=ii-1
  771.   a.0=ii
  772. END
  773. RETURN 0
  774.  
  775.  
  776. do_file_requests:
  777. fr='File_Requests'
  778. IF EXISTS(fr) THEN
  779.   DO
  780.     x=OPEN(f,fr,'R')
  781.     IF x=0 THEN
  782.       DO
  783.         SAY fr 'failed to open for reading!'
  784.         RETURN
  785.       END
  786.     fr.=''
  787.     DO i=1 WHILE ~EOF(f)
  788.       fr.i=READLN(f)
  789.     END
  790.     CALL CLOSE(f)
  791.     fr.0=i
  792.     IF fr.i='' THEN fr.0=i-1
  793.     IF load_files() THEN RETURN
  794.     selected=''
  795.     DO i=1 TO fr.0
  796.       num=fr.i
  797.       IF DATATYPE(num,'W') THEN
  798.         DO
  799.           IF f.num='' THEN
  800.             DO
  801.               SAY 'File Number' num 'does not exist!'
  802.               ITERATE i
  803.             END
  804.           subpath=WORD(f.num,1)'/'WORD(f.num,2)
  805.           finfo=STATEF(bbspath'FileNotes/'subpath)
  806.           IF finfo~='' THEN
  807.             DO
  808.               x=OPEN(f,bbspath'FileNotes/'subpath,'R')
  809.               IF x=0 THEN
  810.                 DO
  811.                   SAY bbspath'FileNotes/'subpath 'failed to open for reading!'
  812.                   ITERATE i
  813.                 END
  814.               note.=''
  815.               DO j=1 WHILE ~EOF(f)
  816.                 note.j=READLN(f)
  817.               END
  818.               CALL CLOSE(f)
  819.               note.0=j
  820.               IF note.j='' THEN note.0=j-1
  821.               PARSE VAR note.2 line'Downloads: 'num .
  822.               IF DATATYPE(num,'W') THEN
  823.                 DO
  824.                   note.2=line'Downloads:' num+1
  825.                   x=OPEN(f,bbspath'FileNotes/'subpath,'W')
  826.                   IF x=0 THEN
  827.                     DO
  828.                       SAY bbspath'FileNotes/'subpath 'failed to open for updating!'
  829.                       ITERATE i
  830.                     END
  831.                   DO j=1 TO note.0
  832.                     CALL WRITELN(f,note.j)
  833.                   END
  834.                   CALL CLOSE(f)
  835.                 END
  836.               ELSE
  837.                 DO
  838.                   SAY 'Unable to PARSE filenote' subpath 'for download count.'
  839.                   SAY note.2
  840.                 END
  841.             END
  842.           IF EXISTS(libpath||subpath) THEN
  843.             selected=STRIP(selected libpath||subpath)
  844.           ELSE IF WORDS(finfo)>7 THEN
  845.             DO
  846.               comment=SUBSTR(finfo,WORDINDEX(finfo,8))
  847.               IF EXISTS(comment) THEN selected=STRIP(comment selected)
  848.             END
  849.           ELSE SAY subpath 'is missing!  Unable to archive for download.'
  850.         END
  851.       ELSE IF fr.i~='' THEN
  852.         SAY 'Unknown file request!' fr.i  'Unable to archive for download.'
  853.     END
  854.     SAY
  855.     SAY 'Selected file request list:'
  856.     DO i=1 TO WORDS(selected)
  857.       SAY WORD(selected,i)
  858.     END
  859.     SAY
  860.     ADDRESS AREXX bbsArcExt.rexx name selected
  861.     CALL DELETE(fr)
  862.     SAY 'File Requests have been passed to the file archiver...'
  863.     SAY
  864.     CALL DELAY(100)
  865.   END
  866. RETURN
  867.  
  868.  
  869. do_file_deletes:
  870. fr='File_Deletes'
  871. IF ~EXISTS(fr) THEN RETURN
  872. x=OPEN(f,fr,'R')
  873. IF x=0 THEN
  874.   DO
  875.     SAY fr 'failed to open for reading!'
  876.     RETURN
  877.   END
  878. fr.=''
  879. DO i=1 WHILE ~EOF(f)
  880.   fr.i=READLN(f)
  881. END
  882. CALL CLOSE(f)
  883. fr.0=i
  884. IF fr.i='' THEN fr.0=i-1
  885. IF load_files() THEN RETURN
  886. IF load_alpha() THEN RETURN
  887. DO i=1 TO fr.0
  888.   num=fr.i
  889.   IF DATATYPE(num,'W') THEN
  890.     DO
  891.       IF f.num='' THEN
  892.         DO
  893.           SAY 'File Number' num 'does not exist to delete!'
  894.           ITERATE i
  895.         END
  896.       subpath=WORD(f.num,1)'/'WORD(f.num,2)
  897.       finfo=STATEF(bbspath'FileNotes/'subpath)
  898.       IF sysoplevel>level THEN
  899.         DO
  900.           x=OPEN(f,bbspath'FileNotes/'subpath,'R')
  901.           IF x=0 THEN
  902.             DO
  903.               SAY bbspath'FileNotes/'subpath 'failed to open for reading!'
  904.               ITERATE i
  905.             END
  906.           CALL READLN(f)
  907.           CALL READLN(f)
  908.           from=WORD(READLN(f),2)
  909.           CALL CLOSE(f)
  910.           IF name~=from THEN
  911.             DO
  912.               SAY subpath 'not deleted.'
  913.               SAY 'You may only delete files you have uploaded yourself.'
  914.               ITERATE i
  915.             END
  916.         END
  917.       IF EXISTS(libpath||subpath) THEN
  918.         DO
  919.           IF DELETE(libpath||subpath)=0 THEN
  920.             SAY 'Failed to delete' libpath||subpath
  921.         END
  922.       ELSE IF WORDS(finfo)>7 THEN
  923.         DO
  924.           comment=SUBSTR(finfo,WORDINDEX(finfo,8))
  925.           IF EXISTS(comment) THEN
  926.             IF DELETE(comment)=0 THEN SAY 'Failed to delete' comment
  927.         END
  928.       ELSE SAY subpath 'is missing!  Unable to delete.'
  929.       IF DELETE(bbspath'FileNotes/'subpath)=0 THEN
  930.         SAY 'Failed to delete' bbspath'FileNotes/'subpath
  931.       f.num=''
  932.       anum=f.num.0
  933.       IF DATATYPE(anum,'W') THEN a.anum=''
  934.       savefiles=1
  935.       SAY 'Deleted' subpath', file number' num'.'
  936.     END
  937.   ELSE IF STRIP(fr.i)~='' THEN SAY 'Unknown delete request!' fr.i
  938. END
  939. SAY
  940. CALL DELETE(fr)
  941. RETURN
  942.  
  943.  
  944. load_libs:
  945. IF libs.0='' THEN RETURN
  946. sysoplibnum=0
  947. libs.=''
  948. x=OPEN(f,bbspath'Lists/Libraries','R')
  949. IF x=0 THEN
  950.   DO
  951.     SAY bbspath'Lists/Libraries failed to open for reading!'
  952.     CALL GETOUT(0)
  953.   END
  954. DO ii=1
  955.   line=READLN(f)
  956.   IF EOF(f) | line='END' THEN LEAVE ii
  957.   num=WORD(line,1)
  958.   IF DATATYPE(num,'W') THEN
  959.     DO
  960.       num=num%1
  961.       IF num>0 & num<100 THEN
  962.         DO
  963.           libs.num=WORD(line,2)
  964.           IF UPPER(libs.num)='SYSOPS' THEN sysopslibnum=num
  965.         END
  966.     END
  967. END
  968. CALL CLOSE(f)
  969. RETURN
  970.  
  971.  
  972. load_conf:
  973. conf.=''
  974. x=OPEN(f,bbspath'Lists/Conferences','R')
  975. IF x=0 THEN
  976.   DO
  977.     SAY bbspath'Lists/Conferences failed to open for reading!'
  978.     CALL GETOUT(0)
  979.   END
  980. conf.=''
  981. DO ii=1
  982.   line=READLN(f)
  983.   IF EOF(f) | line='END' THEN LEAVE ii
  984.   num=WORD(line,1)
  985.   IF DATATYPE(num,'W') THEN
  986.     DO
  987.       num=num%1
  988.       IF num>0 & num<100 THEN conf.num=WORD(line,2)
  989.     END
  990. END
  991. CALL CLOSE(f)
  992. RETURN
  993.  
  994.  
  995. do_user_change:
  996. uc='User_Changes'
  997. IF ~EXISTS(uc) THEN RETURN
  998. x=OPEN(f,uc,'R')
  999. IF x=0 THEN
  1000.   DO
  1001.     SAY uc 'failed to open for reading!'
  1002.     RETURN
  1003.   END
  1004. uc.=''
  1005. DO i=1 WHILE ~EOF(f)
  1006.   uc.i=READLN(f)
  1007. END
  1008. CALL CLOSE(f)
  1009. uc.0=i
  1010. IF uc.i='' THEN uc.0=i-1
  1011. DO i=1 TO uc.0
  1012.   PARSE VAR uc.i uname mins lev exc
  1013.   x=OPEN(f,bbspath'Users/'uname,'R')
  1014.   IF x=0 THEN
  1015.     DO
  1016.       SAY uname 'does not appear to be a member of' bbsname
  1017.       ITERATE i
  1018.     END
  1019.   DO j=1
  1020.     line=READLN(f)
  1021.     IF EOF(f) THEN LEAVE j
  1022.     data.j=line
  1023.   END
  1024.   CALL CLOSE(f)
  1025.   data.0=j-1
  1026.   IF DATATYPE(mins,'W') THEN data.11=mins 'minutes' calls 'more times today.'
  1027.   IF DATATYPE(lev,'W') THEN data.20=lev
  1028.   IF STRIP(exc)~='' THEN data.21=exc
  1029.   x=OPEN(f,bbspath'Users/'uname,'W')
  1030.   IF x=0 THEN
  1031.     DO
  1032.       SAY uname 'did not open for writing!'
  1033.       ITERATE i
  1034.     END
  1035.   DO j=1 TO data.0
  1036.     CALL WRITELN(f,data.j)
  1037.   END
  1038.   CALL CLOSE(f)
  1039. END
  1040. CALL DELETE(uc)
  1041. RETURN
  1042.  
  1043.  
  1044. get_last:
  1045. PARSE ARG statname
  1046. x=OPEN(f,statname,'R')
  1047. IF x=0 THEN
  1048.   DO
  1049.     SAY statname 'failed to open for reading!'
  1050.     RETURN 0
  1051.   END
  1052. last=READLN(f)
  1053. CALL CLOSE(f)
  1054. IF DATATYPE(last,'W') THEN last=last+1
  1055. ELSE RETURN 0
  1056. OPTIONS FAILAT 20
  1057. ADDRESS COMMAND 'ECHO >'statname last
  1058. RETURN last
  1059.  
  1060.  
  1061. GETOUT:
  1062. ARG err 
  1063. IF err>0 THEN SAY 'Error:' err'  RC='RC'  SIGL='SIGL
  1064. ERROR:
  1065. SYNTAX:
  1066. FAILURE:
  1067. IF RC>0 THEN SAY 'RC='RC'  SIGL='SIGL
  1068. IF GETCLIP('BBS_'name)='QUICKIN' THEN CALL SETCLIP('BBS_'name)
  1069. CALL SETCLIP('BBS_QUICKIN'clipnum)
  1070. EXIT err
  1071.  
  1072. /* bbsQUICKIN.rexx */
  1073.